package logo

import (
	"bytes"
	"encoding/json"
	"fmt"
)

type Formatter func(*Entry) ([]byte, error)

func serialize(data interface{}) ([]byte, error) {
	if res, ok := data.(string); ok {
		return []byte(fmt.Sprintf("string: %s", res)), nil
	}
	res, err := json.MarshalIndent(data, "", "  ")
	if err != nil {
		return nil, err
	}
	return res, nil
}
func TextFormatter(e *Entry) ([]byte, error) {
	// data := ""
	var err error
	buf := &bytes.Buffer{}
	if e.File != "" {
		// 等级 时间 文件 行号 信息
		_, err = buf.WriteString(fmt.Sprintf("[%5s] %s %s:%d\n%s", GetLevelString(e.Level), e.Time.Format(timeFormatter), e.File, e.Line, e.Message))
		if err != nil {
			return nil, err
		}
	} else {
		// 等级 时间 信息
		_, err = buf.WriteString(fmt.Sprintf("[%5s] %s %s", GetLevelString(e.Level), e.Time.Format(timeFormatter), e.Message))
		if err != nil {
			return nil, err
		}
	}

	if e.Data != nil {
		dataStr, err := serialize(e.Data)
		if err != nil {
			return nil, err
		}

		_, err = buf.WriteString("\nDATA: ")
		if err != nil {
			return nil, err
		}
		_, err = buf.Write(dataStr)
		if err != nil {
			return nil, err
		}
	}

	// errString := ""
	if e.Err != nil {
		// errString = e.Err.Error()
		_, err = buf.WriteString(fmt.Sprintf("\nERROR: %s", e.Err.Error()))
		if err != nil {
			return nil, err
		}
	}
	err = buf.WriteByte('\n')
	if err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}

func JSONFormatter(e *Entry) ([]byte, error) {
	if e.Err != nil {
		e.Error = e.Err.Error()
	}
	return json.MarshalIndent(e, "", "  ")
}
